/**
 * 循环控制工具函数
 * 提供函数式的循环控制机制
 */

/**
 * 执行函数n次并收集结果
 * @template T - 函数返回类型
 * @param {number} n - 执行次数
 * @param {(index: number) => T} func - 要执行的函数
 * @returns {T[]} 执行结果数组
 * @example
 * const squares = times(5, i => i * i);
 * console.log(squares); // [0, 1, 4, 9, 16]
 */
export function times<T>(n: number, func: (index: number) => T): T[] {
  if (n < 0) {
    throw new Error('执行次数不能为负数');
  }

  const results: T[] = [];
  for (let i = 0; i < n; i++) {
    results.push(func(i));
  }
  return results;
}

/**
 * 函数式的while循环
 * @template T - 循环体函数返回类型
 * @param {() => boolean} condition - 循环条件函数
 * @param {() => T} func - 循环体函数
 * @returns {T[]} 循环执行结果数组
 * @example
 * let counter = 0;
 * const results = whileLoop(
 *   () => counter < 5,
 *   () => {
 *     counter++;
 *     return counter * 2;
 *   }
 * );
 * console.log(results); // [2, 4, 6, 8, 10]
 */
export function whileLoop<T>(condition: () => boolean, func: () => T): T[] {
  const results: T[] = [];
  while (condition()) {
    results.push(func());
  }
  return results;
}